home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #15 / Monster Media Number 15 (Monster Media)(July 1996).ISO / bbs_util / bsrc_260.zip / SRC.ZIP / M7REC.C < prev    next >
C/C++ Source or Header  |  1996-02-20  |  6KB  |  192 lines

  1. /*--------------------------------------------------------------------------*/
  2. /*                                                                          */
  3. /*                                                                          */
  4. /*      ------------         Bit-Bucket Software, Co.                       */
  5. /*      \ 10001101 /         Writers and Distributors of                    */
  6. /*       \ 011110 /          Freely Available<tm> Software.                 */
  7. /*        \ 1011 /                                                          */
  8. /*         ------                                                           */
  9. /*                                                                          */
  10. /*              (C) Copyright 1987-96, Bit Bucket Software Co.              */
  11. /*                                                                          */
  12. /*                  This module was written by Bob Hartman                  */
  13. /*                                                                          */
  14. /*                BinkleyTerm Modem7 Receiver State Machine                 */
  15. /*                                                                          */
  16. /*                                                                          */
  17. /*    For complete  details  of the licensing restrictions, please refer    */
  18. /*    to the License  agreement,  which  is published in its entirety in    */
  19. /*    the MAKEFILE and BT.C, and also contained in the file LICENSE.260.    */
  20. /*                                                                          */
  21. /*    USE  OF THIS FILE IS SUBJECT TO THE  RESTRICTIONS CONTAINED IN THE    */
  22. /*    BINKLEYTERM  LICENSING  AGREEMENT.  IF YOU DO NOT FIND THE TEXT OF    */
  23. /*    THIS  AGREEMENT IN ANY OF THE  AFOREMENTIONED FILES,  OR IF YOU DO    */
  24. /*    NOT HAVE THESE FILES,  YOU  SHOULD  IMMEDIATELY CONTACT BIT BUCKET    */
  25. /*    SOFTWARE CO.  AT ONE OF THE  ADDRESSES  LISTED BELOW.  IN NO EVENT    */
  26. /*    SHOULD YOU  PROCEED TO USE THIS FILE  WITHOUT HAVING  ACCEPTED THE    */
  27. /*    TERMS  OF  THE  BINKLEYTERM  LICENSING  AGREEMENT,  OR  SUCH OTHER    */
  28. /*    AGREEMENT AS YOU ARE ABLE TO REACH WITH BIT BUCKET SOFTWARE, CO.      */
  29. /*                                                                          */
  30. /*                                                                          */
  31. /* You can contact Bit Bucket Software Co. at any one of the following      */
  32. /* addresses:                                                               */
  33. /*                                                                          */
  34. /* Bit Bucket Software Co.        FidoNet  1:104/501, 1:343/491             */
  35. /* P.O. Box 460398                AlterNet 7:42/1491                        */
  36. /* Aurora, CO 80046               BBS-Net  86:2030/1                        */
  37. /*                                Internet f491.n343.z1.fidonet.org         */
  38. /*                                                                          */
  39. /* Please feel free to contact us at any time to share your comments about  */
  40. /* our software and/or licensing policies.                                  */
  41. /*                                                                          */
  42. /*--------------------------------------------------------------------------*/
  43.  
  44. /* Include this file before any other includes or defines! */
  45.  
  46. #include "includes.h"
  47.  
  48. int MRInit (XMARGSP);
  49. int MREnd (XMARGSP);
  50. int MRSendNak (XMARGSP);
  51. int MRWaitAck (XMARGSP);
  52. int MRWaitChar (XMARGSP);
  53. int MRWaitOkCk (XMARGSP);
  54.  
  55. typedef struct
  56. {
  57.     char *state_name;
  58.     int (*state_func) (XMARGSP);
  59. } MSTATES, *MSTATEP;
  60.  
  61. MSTATES Modem7_Receiver[] =
  62. {
  63.     {"MRInit", MRInit},
  64.     {"MREnd", MREnd},
  65.     {"MR0", MRSendNak},
  66.     {"MR1", MRWaitAck},
  67.     {"MR2", MRWaitChar},
  68.     {"MR3", MRWaitOkCk}
  69. };
  70.  
  71. int 
  72. MRInit (XMARGSP args)
  73. {
  74.     args->tries = 0;
  75.     return ((int) args->control);
  76. }
  77.  
  78. int 
  79. MREnd (XMARGSP args)
  80. {
  81.     args->result = (int) args->control;
  82.     return (args->result);
  83. }
  84.  
  85. int 
  86. MRSendNak (XMARGSP args)
  87. {
  88.     if (args->tries >= 10)
  89.         return (FNAME_ERR);
  90.  
  91.     args->fptr = args->filename;
  92.  
  93.     SENDBYTE (NAK);
  94.     ++(args->tries);
  95.     return (MR1);
  96. }
  97.  
  98. int 
  99. MRWaitAck (XMARGSP args)
  100. {
  101.     long MR1Timer;
  102.     int in_char;
  103.  
  104.     MR1Timer = timerset (1000);
  105.     while (!timeup (MR1Timer))
  106.     {
  107.         if ((in_char = PEEKBYTE ()) >= 0)
  108.         {
  109.             (void) TIMED_READ (0);
  110.             switch (in_char)
  111.             {
  112.             case ACK:
  113.                 return (MR2);
  114.  
  115.             case EOT:
  116.                 args->result = SUCCESS_EOT;
  117.                 return (SUCCESS_EOT);
  118.             }
  119.         }
  120.         else
  121.         {
  122.             if (!CARRIER)
  123.                 return (CARRIER_ERR);
  124.             else
  125.                 time_release ();
  126.         }
  127.     }
  128.  
  129.     return (MR0);
  130. }
  131.  
  132. int 
  133. MRWaitChar (XMARGSP args)
  134. {
  135.     int in_char;
  136.     unsigned char check;
  137.     char *p;
  138.  
  139.     in_char = TIMED_READ (10);
  140.     switch (in_char)
  141.     {
  142.     case -1:
  143.         return (MR0);
  144.  
  145.     case EOT:
  146.         return (SUCCESS);
  147.  
  148.     case SUB:
  149.         for (p = args->filename, check = SUB; p != args->fptr; p++)
  150.             check += (unsigned char) *p;
  151.         SENDBYTE (check);
  152.         return (MR3);
  153.  
  154.     case 'u':
  155.         return (MR0);
  156.  
  157.     default:
  158.         break;
  159.     }
  160.  
  161.     *args->fptr++ = (char) (in_char & 0xff);
  162.     SENDBYTE (ACK);
  163.     return (MR2);
  164. }
  165.  
  166. int 
  167. MRWaitOkCk (XMARGSP args)
  168. {
  169.     int in_char;
  170.  
  171.     in_char = TIMED_READ (10);
  172.     if (in_char == ACK)
  173.     {
  174.         args->result = SUCCESS;
  175.         return (SUCCESS);
  176.     }
  177.  
  178.     return (MR0);
  179. }
  180.  
  181. int 
  182. Modem7_Receive_File (char *filename)
  183. {
  184.     XMARGS batch;
  185.     int res;
  186.  
  187.     batch.result = 0;
  188.     batch.filename = filename;
  189.     res = state_machine ((STATEP) Modem7_Receiver, &batch, 2);
  190.     return (res);
  191. }
  192.